/**
 * 
 */
package es.uab.es2.TimeTracker.nucli;

import java.util.ArrayList;
//import java.util.Collection;
import java.util.Date;

/** 
 * Classe final en la estructura del <code>composite</code>, son les <code>activitats</code> que s'han de cronometrar. 
 * Per obtenir la seva durada tenim un array <code>Interval</code>, la suma de la durades dels intervals ser� la 
 * <code>duracio</code> de la tasca.
 * @author Jes�s Berm�dez, Ricard Figueras i Abel Rodr�guez.
 */
public class Tasca extends Activitat {

    
  //********************** Constructors **********************
    /**
     * Es heredat de la classe {@link Activitat}.
     * Realitza la asignaci� de atributs de la 
     * {@link Tasca}.
     * @param nom, nom de la Tasca important para identificar
     * @param descr, descripci� de la Tasca per obtenir
     * informaci� de la seva utilitat.
     * @param pare, Projecte pare que pertany a la Tasca.
     * @param arrel, ArrayList on es guarden les tota tasca.
     */
public Tasca(final String nom, final String descr, final Projecte pare, 
        final ArrayList<Activitat> arrel) {
        super(nom, descr, pare, arrel);
        // TODO Auto-generated constructor stub
	   
    }
	

	//********************** Atributs **********************
	



	/**
	 * Guarda el {@link Interval} creats
	 *  cada vegada que es cronometra
	 *  la {@link Tasca}.
	 * @uml.property  name="intervals"
	 * @uml.associationEnd  multiplicity="(0 -1)" aggregation="shared" 
	 * inverse="tascaPare:es.uab.es2.TimeTracker.nucli.Interval"
	 */
	private ArrayList<Interval> intervals = new java.util.ArrayList<Interval>();

	

	//********************** Getters & Setters **********************
	
	/**
     * Getter of the property <tt>intervals</tt>.
     * @return  Returns the intervals.
     * @uml.property  name="intervals"
     */
    public final ArrayList<Interval> getIntervals() {
        return intervals;
    }
	
	/**
	 * Setter of the property <tt>intervals</tt>.
	 * @param intervals  The intervals to set.
	 * @uml.property  name="intervals"
	 */
	public final void setIntervals(final ArrayList<Interval> alIntervals) {
		this.intervals = alIntervals;
	}



	//********************** Metodes de la Classe **********************
	
	/**
     * Atura el cronometratge treient com notificador 
     * el {@link Interval} del {@link Rellotge} llavors
     * es deixa de cronometrar. 
     */
    public final void pararCronometre(final Rellotge clock) {
       
        int i = 0;
        i = intervals.size() - 1;
        
        clock.deleteObserver(intervals.get(i));
        
    }
    /**
     * Realitza una pausa en el {@link Rellotge}
     * es va implementar per realitzar la alarma.
     */
    public final void pausarCronometre(final Rellotge clock) {
        clock.parar();
    }

    
	
	/**
	 * Inicia el cronometratge  es crea un {@link Interval} 
	 * per a que comenci a cronometrar i actualitza les dates 
	 * amb els projectes pare.
	 * @param nom  �s el nom del interval creat.
	 * @param desc �s la descripci� del interval creat. 
	 * @param clock Rellotge utilitzat en tota la aplicaci� 
	 * per notificar al interval com observador.
    */
	public final void cronometrar(final String nom, final String desc, 
	        final Rellotge clock) {
	    Interval i = new Interval(nom, desc , this);
	    Date d = i.getDataInici(); 
	    Projecte p = this.getProjectePare();
	    while (p != null) {
	       // System.out.println(p.getDataInicial());
	     if (this.getDataInicial() == null 
	             || this.getDataInicial().after(i.getDataInici())) {
	          //Controlar si la tasca pare es null
	            this.setDataInicial(d);
	               
	      }
	     if (p.getDataInicial() == null 
	             || p.getDataInicial().after(this.getDataInicial())) {
	            //controlar que el projecte pare es null
	            p.setDataInicial(this.getDataInicial());
	        }
	        p = p.getProjectePare(); 
	    }
	    
	    clock.addObserver(i);
	    
	 
	    
	}

		
		/**
		 * Realitzar proves de funcionalitat per JUnit.
		 */
		public Tasca() {
		}

		
		
}
